package cn.zhukelili.clonewaybak;

/**
 * @Description: 发起人自主备份和恢复
 * @Auther: hongheshou
 * @Date: 2018/7/23 14:23
 */
public class Originator implements Cloneable {
    private Originator backup;
    //内部状态
    private String state = "";

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    //创建一个备忘录
    public void createMemento() {
        this.backup = this.clone();
    }

    //恢复一个备忘录
    public void restoreMemento() {
//在进行恢复前应该进行断言，防止空指针
        this.setState(this.backup.getState());
    }

    //克隆当前对象
    @Override
    protected Originator clone() {
        try {
            return (Originator) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
}

/*
可能你要发问了，这和备忘录模式的定义不相符，它定义是“在该对象之外保存这个状
态”，而你却把这个状态保存在了发起人内部。是的，设计模式定义的诞生比Java的出世略
早，它没有想到Java程序是这么有活力，有远见，而且在面向对象的设计中，即使把一个类
封装在另一个类中也是可以做到的，何况一个小小的对象复制，这是它的设计模式完全没有
预见到的，我们把它弥补回来。
 */